package com.wymobilearchitecture.demo.kt

fun main() {
    val list = mutableListOf(1,2)
    list.swap(0,1)
    println("扩展函数: $list")

    val listT = mutableListOf("A","B")
    list.swapT(0,1)
    println("带泛型的扩展方法: $listT")

    println("扩展属性:  ${"12345".lastChar}")

    People.eat()

    testLet(null)
    testLet("null")

    testRun(Room("大连",10000f,100f))

    testApply()
}

/**
 * 扩展方法
 */
fun MutableList<Int>.swap(index1:Int,index2: Int) {
    val temp = this[index1]
    this[index2] = this[index1]
    this[index1] = temp
}

/**
 * 带泛型的扩展方法
 */
fun <T> MutableList<T>.swapT(index1: Int,index2: Int){
    val temp = this[index1]
    this[index2] = this[index1]
    this[index1] = temp
}

/**
 * 扩展属性
 */
val String.lastChar : Char get() = this[this.length - 1]


/**
 * 伴生对象扩展-静态
 */
class People{
    companion object{}
}

fun People.Companion.eat(){
    println("伴生对象扩展: eat")
}


/**
 * kotlin 自带扩展 let
 * 是一个作用域函数,当需要定义一个变量再一个特定的作用域范围内,可以用 let 函数
 * 可以避免一些判空操作
 * */
fun testLet(str : String?){
    //限制作用域,大括号外无法调用
    str?.let {
        val str2 = "作用域"
        println("let 作用域: $str2")
    }

    //加问号 避免 null 操作
    str?.let{
        println("let 防 null: ${it.length}")
    }
}

/**
 * kotlin 自带扩展 run
 * 只接收一个 lambda 函数,以闭包的形式返回,返回值为最后一行的值或者指定的 return 表达式,
 * 再 run 函数中可以直接访问实例的公有属性和方法
 * */
fun testRun(room :Room){
    room.run {
        println("run函数: $address,$price,$size" )
    }
}

data class Room(val address: String,val price : Float,val size : Float)


/**
 * kotlin 自带扩展 apply
 * 在函数范围内,可以任意调用该对象的任意方法,并返回该对象,类似与 Java builder
 * */
fun testApply(){
    ArrayList<String>().apply {
        add("1")
        add("2")
        add("3")
    }.let {
        println("自带扩展 apply : $it")
    }
}